#!/usr/bin/env python3
"""
Dify数据分析项目使用示例
演示如何使用各个模块进行数据分析
"""

import os
import sys
import logging
import json
from datetime import datetime

# 添加项目路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'database'))

from data_labeling import DataLabeler
from data_analysis import DataAnalyzer
from report_generator import ReportGenerator
from database.data_reader import DataReader
import pandas as pd

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def create_sample_data():
    """创建示例数据"""
    logger.info("创建示例数据...")
    
    # 模拟一些用户评论数据
    sample_data = pd.DataFrame({
        'id': range(1, 101),
        'user_id': [f'user_{i}' for i in range(1, 101)],
        'content': [
            '这个产品真的很好用，推荐给大家！',
            '质量不错，但是价格有点贵',
            '服务态度很好，物流也很快',
            '产品有缺陷，需要改进',
            '整体还行，符合预期',
            '超出预期，非常满意！',
            '一般般，没有特别的亮点',
            '性价比很高，值得购买',
            '质量有问题，不推荐',
            '客服很耐心，解决了我的问题'
        ] * 10,  # 重复10次得到100条数据
        'rating': [5, 3, 4, 2, 3, 5, 3, 4, 2, 4] * 10,
        'timestamp': pd.date_range('2024-01-01', periods=100, freq='D'),
        'category': ['电子产品', '服装', '家居', '食品', '书籍'] * 20
    })
    
    return sample_data

def demo_data_labeling():
    """演示数据标注功能"""
    logger.info("=== 数据标注演示 ===")
    
    # 创建示例数据
    data = create_sample_data()
    
    # 模型配置（这里使用模拟配置）
    model_config = {
        'api_endpoint': 'https://api.openai.com/v1/chat/completions',
        'api_key': 'your-api-key',  # 请替换为实际的API密钥
        'model_name': 'gpt-3.5-turbo',
        'max_retries': 3,
        'retry_delay': 1
    }
    
    # 标注规则
    labeling_rules = {
        'sentiment_categories': ['positive', 'negative', 'neutral'],
        'quality_criteria': {
            'relevance': '内容相关性评分 1-10',
            'clarity': '表达清晰度评分 1-10',
            'usefulness': '实用性评分 1-10'
        },
        'tags': ['推荐', '不推荐', '需要改进', '满意', '不满意']
    }
    
    # 创建标注器（注意：这里只是演示，实际使用需要有效的API密钥）
    try:
        labeler = DataLabeler(model_config)
        
        # 对前5条数据进行标注演示
        sample_data = data.head(5)
        logger.info(f"演示标注前5条数据...")
        
        # 模拟标注结果（实际使用时会调用API）
        mock_results = []
        for idx, row in sample_data.iterrows():
            mock_result = {
                'labels': {
                    'sentiment': 'positive' if row['rating'] >= 4 else 'negative' if row['rating'] <= 2 else 'neutral',
                    'quality_score': row['rating'] * 2,
                    'tags': ['推荐'] if row['rating'] >= 4 else ['不推荐'] if row['rating'] <= 2 else ['一般']
                },
                'confidence': 0.85,
                'reasoning': f"基于评分 {row['rating']} 进行分类",
                'timestamp': datetime.now().isoformat(),
                'model': 'gpt-3.5-turbo'
            }
            mock_results.append(mock_result)
        
        # 添加标注结果到数据
        sample_data['labeling_result'] = mock_results
        sample_data['labels'] = [r['labels'] for r in mock_results]
        sample_data['confidence'] = [r['confidence'] for r in mock_results]
        
        logger.info("标注演示完成")
        return sample_data
        
    except Exception as e:
        logger.error(f"标注演示失败: {str(e)}")
        # 返回带有模拟标注的数据
        return create_sample_data_with_mock_labels()

def create_sample_data_with_mock_labels():
    """创建带有模拟标注的示例数据"""
    data = create_sample_data()
    
    # 添加模拟标注结果
    mock_labels = []
    confidences = []
    
    for _, row in data.iterrows():
        sentiment = 'positive' if row['rating'] >= 4 else 'negative' if row['rating'] <= 2 else 'neutral'
        quality_score = row['rating'] * 2
        
        label = {
            'sentiment': sentiment,
            'quality_score': quality_score,
            'category': row['category'],
            'tags': ['推荐'] if row['rating'] >= 4 else ['不推荐'] if row['rating'] <= 2 else ['一般']
        }
        
        mock_labels.append(json.dumps(label, ensure_ascii=False))
        confidences.append(0.8 + (row['rating'] / 10))  # 模拟置信度
    
    data['labels'] = mock_labels
    data['confidence'] = confidences
    
    return data

def demo_data_analysis():
    """演示数据分析功能"""
    logger.info("=== 数据分析演示 ===")
    
    # 获取带标注的数据
    labeled_data = create_sample_data_with_mock_labels()
    
    # 创建分析器
    analyzer = DataAnalyzer(labeled_data)
    
    # 运行完整分析
    analysis_results = analyzer.run_complete_analysis()
    
    logger.info("数据分析完成")
    return analysis_results

def demo_report_generation(analysis_results):
    """演示报告生成功能"""
    logger.info("=== 报告生成演示 ===")
    
    # 创建报告生成器
    generator = ReportGenerator(analysis_results)
    
    # 生成HTML报告
    html_report = generator.generate_html_report('demo_report.html')
    
    # 生成JSON报告
    json_report = generator.generate_json_report('demo_report.json')
    
    logger.info(f"HTML报告生成完成: {html_report}")
    logger.info(f"JSON报告生成完成: {json_report}")
    
    return html_report, json_report

def demo_database_connection():
    """演示数据库连接功能"""
    logger.info("=== 数据库连接演示 ===")
    
    try:
        # 注意：这需要数据库服务正在运行
        with DataReader() as reader:
            # 获取表列表
            tables = reader.list_tables()
            logger.info(f"数据库中的表: {tables}")
            
            # 如果有表，读取第一个表的数据
            if tables:
                df = reader.read_table(tables[0], limit=10)
                logger.info(f"表 {tables[0]} 的数据:")
                print(df.head())
            else:
                logger.info("数据库中没有表")
                
    except Exception as e:
        logger.warning(f"数据库连接失败: {str(e)}")
        logger.info("请确保数据库服务正在运行")

def main():
    """主函数"""
    logger.info("🚀 开始 Dify 数据分析项目演示")
    
    # 创建输出目录
    os.makedirs('demo_output', exist_ok=True)
    os.chdir('demo_output')
    
    try:
        # 1. 演示数据标注
        labeled_data = demo_data_labeling()
        logger.info(f"标注数据形状: {labeled_data.shape}")
        
        # 2. 演示数据分析
        analysis_results = demo_data_analysis()
        logger.info("分析结果keys:", list(analysis_results.keys()))
        
        # 3. 演示报告生成
        html_report, json_report = demo_report_generation(analysis_results)
        
        # 4. 演示数据库连接（可选）
        demo_database_connection()
        
        logger.info("✅ 演示完成!")
        logger.info("📊 生成的文件:")
        logger.info(f"  - HTML报告: {html_report}")
        logger.info(f"  - JSON报告: {json_report}")
        
        # 显示执行摘要
        generator = ReportGenerator(analysis_results)
        summary = generator.generate_executive_summary()
        logger.info("📋 执行摘要:")
        logger.info(summary)
        
    except Exception as e:
        logger.error(f"演示过程中发生错误: {str(e)}")
        return False
    
    return True

if __name__ == "__main__":
    success = main()
    sys.exit(0 if success else 1) 